﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using EControl.Modelo;
using System.Data.SqlClient;
using System.Windows;

namespace EControl.Controle
{
    class VeiculoController
    {
        private string strConn = "Data Source=MARIA-PC\\SQLEXPRESS;Initial Catalog=dbestacionamento;Integrated Security=False;User ID=developer;Password=developer;Connect Timeout=15;Encrypt=False;TrustServerCertificate=False";

        public int vagasEmUso()
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query = "select count(*) uso from vaga where is_ativo = 1 and is_em_uso = 1";

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                SqlDataReader dr = cmd.ExecuteReader();

                int vagas = 0;

                while (dr.Read())
                {
                    vagas = (int)dr["uso"];
                }

                sqlCon.Close();

                return vagas;
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return 0;
            }
        }

        public int vagasDisponiveis()
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query = "select count(*) uso from vaga where is_ativo = 1 and is_em_uso = 0";

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                SqlDataReader dr = cmd.ExecuteReader();

                int vagas = 0;

                while (dr.Read())
                {
                    vagas = (int)dr["uso"];
                }

                sqlCon.Close();

                return vagas;
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return 0;
            }
        }

        public bool existeEntrada(string placa)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query = "select count(*) total from veiculo where placa = '"+placa+"' and ts_saida is null";

                SqlCommand cmd = new SqlCommand(query, sqlCon);
                SqlDataReader dr = cmd.ExecuteReader();

                int vagas = 0;

                while (dr.Read())
                {
                    vagas = (int)dr["total"];
                }

                sqlCon.Close();

                return vagas > 0 ? true : false;
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return false;
            }
        }

        public VeiculoModel entradaAvulso(VeiculoModel veiculo)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query1 = "insert into veiculo (placa, vaga_id) values ('"+veiculo.Placa+"', (select top 1 vaga_id from vaga where is_ativo = 1 and is_em_uso = 0))";

                SqlCommand cmd = new SqlCommand(query1, sqlCon);
                int ok1 = cmd.ExecuteNonQuery();

                string query2 = "update vaga set is_em_uso = 1 where vaga_id = (select vaga_id from veiculo where placa = '"+veiculo.Placa+"' and ts_saida is null)";

                cmd = new SqlCommand(query2, sqlCon);
                int ok2 = cmd.ExecuteNonQuery();


                if (ok1 > 0 && ok2 > 0)
                {
                    string query3 = "select v.placa, c.cpf_cnpj, c.nome_razao, v.total_pago, v.vaga_id, v.ts_entrada, v.ts_saida ";
                    query3 += "from veiculo v left join cliente c on c.cliente_id = v.cliente_id ";
                    query3 += "where v.placa = '" + veiculo.Placa + "' and v.ts_saida is null";

                    cmd = new SqlCommand(query3, sqlCon);
                    SqlDataReader dr = cmd.ExecuteReader();

                    VeiculoModel resultado = new VeiculoModel();

                    while (dr.Read())
                    {
                        resultado.Placa = dr["placa"].ToString();
                        resultado.ClienteCpf = dr["cpf_cnpj"].ToString();
                        resultado.ClienteNome = dr["nome_razao"].ToString();
                        resultado.TotalPago = dr["total_pago"].ToString();
                        resultado.Vaga = dr["vaga_id"].ToString();
                        resultado.Entrada = dr["ts_entrada"].ToString();
                        resultado.Saida = dr["ts_saida"].ToString();
                    }

                    sqlCon.Close();

                    return resultado;
                }
                else
                {
                    sqlCon.Close();

                    MessageBoxButton botao = MessageBoxButton.OK;
                    MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);
                    return null;
                }
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return null;
            }
        }

        public VeiculoModel saidaAvulso(VeiculoModel veiculo)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query1 = "update vaga set is_em_uso = 0 where vaga_id = (select vaga_id from veiculo where placa = '"+veiculo.Placa+"' and ts_saida is null)";

                SqlCommand cmd = new SqlCommand(query1, sqlCon);
                int ok1 = cmd.ExecuteNonQuery();

                string query2 = "update veiculo set ts_saida = GETDATE() where veiculo_id = (select veiculo_id from veiculo where placa = '"+veiculo.Placa+"' and ts_saida is null)";

                cmd = new SqlCommand(query2, sqlCon);
                int ok2 = cmd.ExecuteNonQuery();

                string query3 = "update veiculo set total_pago = ( ";
                query3 += "select cast(case when minutos < 60 then 1 else minutos / 60 end as int) * (select top 1 preco from preco where descricao = 'Hora' order by ts_criacao desc) as total_pagar ";
                query3 += "from (select top 1 datediff(minute, ts_entrada, ts_saida) minutos from veiculo where placa = '"+veiculo.Placa+"' order by ts_saida desc) dados) ";
                query3 += "where veiculo_id = (select top 1 veiculo_id from veiculo where placa = '"+veiculo.Placa+"' order by ts_saida desc) ";

                cmd = new SqlCommand(query3, sqlCon);
                int ok3 = cmd.ExecuteNonQuery();


                if (ok1 > 0 && ok2 > 0)
                {
                    string query4 = "select v.placa, c.cpf_cnpj, c.nome_razao, v.total_pago, v.vaga_id, v.ts_entrada, v.ts_saida ";
                    query4 += "from veiculo v left join cliente c on c.cliente_id = v.cliente_id ";
                    query4 += "where v.placa = '" + veiculo.Placa + "' order by ts_saida desc";

                    cmd = new SqlCommand(query4, sqlCon);
                    SqlDataReader dr = cmd.ExecuteReader();

                    VeiculoModel resultado = new VeiculoModel();

                    while (dr.Read())
                    {
                        resultado.Placa = dr["placa"].ToString();
                        resultado.ClienteCpf = dr["cpf_cnpj"].ToString();
                        resultado.ClienteNome = dr["nome_razao"].ToString();
                        resultado.TotalPago = dr["total_pago"].ToString();
                        resultado.Vaga = dr["vaga_id"].ToString();
                        resultado.Entrada = dr["ts_entrada"].ToString();
                        resultado.Saida = dr["ts_saida"].ToString();
                    }

                    sqlCon.Close();

                    return resultado;
                }
                else
                {
                    sqlCon.Close();

                    MessageBoxButton botao = MessageBoxButton.OK;
                    MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);
                    return null;
                }
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return null;
            }
        }

        public VeiculoModel entradaMensalista(VeiculoModel veiculo)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query1 = "insert into veiculo (placa, cliente_id, vaga_id) values ('" + veiculo.Placa + "', (select top 1 cliente_id from cliente where cpf_cnpj = '" + veiculo.ClienteCpf + "'),(select top 1 vaga_id from vaga where is_ativo = 1 and is_em_uso = 0))";

                SqlCommand cmd = new SqlCommand(query1, sqlCon);
                int ok1 = cmd.ExecuteNonQuery();

                string query2 = "update vaga set is_em_uso = 1 where vaga_id = (select vaga_id from veiculo where placa = '" + veiculo.Placa + "' and ts_saida is null)";

                cmd = new SqlCommand(query2, sqlCon);
                int ok2 = cmd.ExecuteNonQuery();


                if (ok1 > 0 && ok2 > 0)
                {
                    string query3 = "select v.placa, c.cpf_cnpj, c.nome_razao, v.total_pago, v.vaga_id, v.ts_entrada, v.ts_saida ";
                    query3 += "from veiculo v left join cliente c on c.cliente_id = v.cliente_id ";
                    query3 += "where v.placa = '" + veiculo.Placa + "' and v.ts_saida is null";

                    cmd = new SqlCommand(query3, sqlCon);
                    SqlDataReader dr = cmd.ExecuteReader();

                    VeiculoModel resultado = new VeiculoModel();

                    while (dr.Read())
                    {
                        resultado.Placa = dr["placa"].ToString();
                        resultado.ClienteCpf = dr["cpf_cnpj"].ToString();
                        resultado.ClienteNome = dr["nome_razao"].ToString();
                        resultado.TotalPago = dr["total_pago"].ToString();
                        resultado.Vaga = dr["vaga_id"].ToString();
                        resultado.Entrada = dr["ts_entrada"].ToString();
                        resultado.Saida = dr["ts_saida"].ToString();
                    }

                    sqlCon.Close();

                    return resultado;
                }
                else
                {
                    sqlCon.Close();

                    MessageBoxButton botao = MessageBoxButton.OK;
                    MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);
                    return null;
                }
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return null;
            }
        }

        public VeiculoModel saidaMensalista(VeiculoModel veiculo)
        {
            try
            {
                SqlConnection sqlCon = new SqlConnection();
                sqlCon.ConnectionString = strConn;

                sqlCon.Open();

                string query1 = "update vaga set is_em_uso = 0 where vaga_id = (select vaga_id from veiculo where placa = '" + veiculo.Placa + "' and ts_saida is null)";

                SqlCommand cmd = new SqlCommand(query1, sqlCon);
                int ok1 = cmd.ExecuteNonQuery();

                string query2 = "update veiculo set ts_saida = GETDATE() where veiculo_id = (select veiculo_id from veiculo where placa = '" + veiculo.Placa + "' and ts_saida is null)";

                cmd = new SqlCommand(query2, sqlCon);
                int ok2 = cmd.ExecuteNonQuery();

                if (ok1 > 0 && ok2 > 0)
                {
                    string query4 = "select v.placa, c.cpf_cnpj, c.nome_razao, v.total_pago, v.vaga_id, v.ts_entrada, v.ts_saida ";
                    query4 += "from veiculo v left join cliente c on c.cliente_id = v.cliente_id ";
                    query4 += "where v.placa = '" + veiculo.Placa + "' order by ts_saida desc";

                    cmd = new SqlCommand(query4, sqlCon);
                    SqlDataReader dr = cmd.ExecuteReader();

                    VeiculoModel resultado = new VeiculoModel();

                    while (dr.Read())
                    {
                        resultado.Placa = dr["placa"].ToString();
                        resultado.ClienteCpf = dr["cpf_cnpj"].ToString();
                        resultado.ClienteNome = dr["nome_razao"].ToString();
                        resultado.TotalPago = dr["total_pago"].ToString();
                        resultado.Vaga = dr["vaga_id"].ToString();
                        resultado.Entrada = dr["ts_entrada"].ToString();
                        resultado.Saida = dr["ts_saida"].ToString();
                    }

                    sqlCon.Close();

                    return resultado;
                }
                else
                {
                    sqlCon.Close();

                    MessageBoxButton botao = MessageBoxButton.OK;
                    MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);
                    return null;
                }
            }
            catch (Exception)
            {
                MessageBoxButton botao = MessageBoxButton.OK;
                MessageBox.Show("Ocorreu um erro no sistema, por favor entre em contato com o administrador do sistema ou tente novamente mais tarde", "Erro", botao);

                return null;
            }
        }
    }
}
